//package com.twd.allcomponent.shiro.config;
//
//import org.apache.shiro.session.Session;
//import org.apache.shiro.session.UnknownSessionException;
//import org.apache.shiro.session.mgt.SimpleSession;
//import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.io.ByteArrayInputStream;
//import java.io.ByteArrayOutputStream;
//import java.io.IOException;
//import java.io.ObjectInputStream;
//import java.io.ObjectOutputStream;
//import java.io.Serializable;
//import java.util.Collection;
//import java.util.Set;
//import java.util.concurrent.TimeUnit;
//import java.util.stream.Collectors;
//
//@Component
//public class SelfSessionDao extends AbstractSessionDAO {
//
//    @Resource
//    private RedisTemplate<Object, byte[]> redisTemplate;
//
//
//    // 创建session 存到redis
//    @Override
//    protected Serializable doCreate(Session session) {
//        Serializable sessionId = generateSessionId(session);
//        assignSessionId(session, sessionId);
//        redisTemplate.boundValueOps("session" + sessionId)
//                .set(sessionToByte(session), 1, TimeUnit.HOURS);
//        return sessionId;
//    }
//
//
//    @Override
//    protected Session doReadSession(Serializable sessionId) {
//        byte[] bytes = redisTemplate.boundValueOps("session" + sessionId).get();
//        return byteToSession(bytes);
//    }
//
//    /**
//     * 更新
//     * @param session
//     * @throws UnknownSessionException
//     */
//    @Override
//    public void update(Session session) throws UnknownSessionException {
//        if (session == null || session.getId() == null) {
//            throw new UnknownSessionException("session 或者 sessionId为空");
//        }
//
//        redisTemplate.boundValueOps("session" + session.getId())
//                .set(sessionToByte(session), 1, TimeUnit.HOURS);
//    }
//
//    /**
//     * 删除session
//     * @param session
//     */
//    @Override
//    public void delete(Session session) {
//        redisTemplate.delete("session" + session.getId());
//
//    }
//
//    @Override
//    public Collection<Session> getActiveSessions() {
//        Set<Object> keys = redisTemplate.keys("session" + "*");
//        if (keys != null) {
//            return keys.stream().map(key -> {
//                byte[] bytes = redisTemplate.boundValueOps(key).get();
//                return byteToSession(bytes);
//            }).collect(Collectors.toList());
//        } else {
//            return null;
//        }
//    }
//
//    // 把session对象转化为byte保存到redis中
//    public byte[] sessionToByte(Session session){
//        ByteArrayOutputStream bo = new ByteArrayOutputStream();
//        byte[] bytes = null;
//        try {
//            ObjectOutputStream oo = new ObjectOutputStream(bo);
//            oo.writeObject(session);
//            bytes = bo.toByteArray();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return bytes;
//    }
//
//    // 把byte还原为session
//    public Session byteToSession(byte[] bytes){
//        ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
//        ObjectInputStream in;
//        SimpleSession session = null;
//        try {
//            in = new ObjectInputStream(bi);
//            session = (SimpleSession) in.readObject();
//        } catch (ClassNotFoundException | IOException e) {
//            e.printStackTrace();
//        }
//
//        return session;
//    }
//}
//
